1.4 初始化

i . 初始化方法

aiLit正常执行依赖并会长久持有Context对象,因此使用aiLit需要通过初始化操作传递Context对象等必备对象,建议在Application#onCreate()中进行初始化。考虑到潜在的内存泄露风险,目前初始化只支持传入Application对象不支持传入Activity、Service等Context子类对象,还望谅解。

aiLit入口类为AiLitContext类,其含有一簇初始化方法簇,请根据实际情况调用:

AiLitContext#initialize(Application context)
AiLitContext#initialize(Application context, OnSpeechReadyListener onSpeechReadyListener)
AiLitContext#initialize(Application context, LitConfiguration litConfiguration, OnSpeechReadyListener onSpeechReadyListener)
AiLitContext#initialize(Application context, SpeechConfig speechConfig, OnSpeechReadyListener onSpeechReadyListener)

ii . 语音就绪监听

因为天琴内部存在多款协同应用,涉及到多款应用内部的模块挂载、相互间的跨进程通信等多类操作,部分Api十分依赖时序。因此aiLit对外提供了语音就绪监听器,以便集成端能够感知语音就绪的时机并调用Api以保障功能的完备。当然,Api调用不在就绪监听中亦可(详见 1.1.6 失败调用)。

/**
 * 语音准备就绪的监听器
 */
public interface OnSpeechReadyListener {

    /**
     * 语音准备就绪时回调
     */
    void onSpeechReady();

    /**
     * 语音重启时回调
     */
    void onSpeechRebooted();

}

向aiLit中注册就绪监听器有两种方式:

  • 初始化时注册

    在初始化 aiLit 时,可选择带有就绪监听器参数的初始化方法。通过此类方法注册的就绪监听器 持有回调最高优先级,当语音就后将会优先调用该类监听器。建议将较为重要的、全局的Api调用放入其中。

  • 不限时机注册

    当初始化完成后,依旧可以在任意代码段、任意时机下通过以下方法注册就绪监听器:

    //默认优先级为AiLitContext.PRIORITY_NORMAL
    AiLitContext#addOnReadyListener(final OnSpeechReadyListener onReadyListener) 
    AiLitContext#addOnReadyListener(int priority, final OnSpeechReadyListener onReadyListener)
    

    建议集成端按照实际项目情况,将就绪监听器按照优先程度分级,以便关键的、影响范围较大的Api调用能够及早执行。

iii. 调用失败策略

当Api调用未包裹在就绪监听器中时,可能会因为天琴未启动、模块未挂载成功等原因而失败。针对此类失败调用( UnpreparedInvoke ),aiLit 提供了一套完备的、可定制的应急措施。具体如下:

  1. 定义Api的两个维度:是否同步、是否在主线程调用;
  2. 定义失败调用的三类处理方案:直接返回失败值/DirectReturn、进入缓存队列等待重试/QueueCache、阻塞当前线程直到语音就绪/Block;
  3. 使用策略模式,引入UnpreparedInvokeStrategy。该策略会根据Api的维度参数,决定调用失败时对应何种处理方案;

策略定义如下:

/**
 * API失败调用的处理策略
 */
public interface UnpreparedInvokeStrategy {

    /**
     * 是否直接返回失败信息
     *
     * @param isMainThread 是否是主线程
     * @param isSynchronousApi 是否需要同步返回
     * @return 策略选项
     */
    boolean isDirectReturn(boolean isMainThread, boolean isSynchronousApi);

    /**
     * 是否使用队列缓存调用,以便服务连接后处理
     *
     * @param isMainThread 是否是主线程
     * @return 策略选项
     */
    boolean isQueueCache(boolean isMainThread);

    /**
     * 是否阻塞当前线程直至服务连接
     *
     * @param isMainThread 是否是主线程
     * @return 策略选项
     */
    boolean isBlock(boolean isMainThread);

}

默认的UnpreparedInvokeStrategy实现为BlockFirstUnpreparedInvokeStrategy,其决策表如下:

维度 同步Api 异步Api
主线程调用 DirectReturn QueueCache
子线程调用 Block Block

集成端可自由定制UnpreparedInvokeStrategy,具体步骤为:

1. 实现 com.aispeech.ipc.strategy.UnpreparedInvokeStrategy 接口

2. 通过构造模式创建LitConfiguration,并设置自定义策略
new LitConfiguration.Builder().setUnpreparedInvokeStrategy(自定义UnpreparedInvokeStrategy).build();

3. 调用aiLit初始化方法传入自定义策略
AiLitContext#initialize(Application context, LitConfiguration litConfiguration, OnSpeechReadyListener onSpeechReadyListener)

iiii. 语音定制

授权定制:

通过对接app传入"设备唯一授权ID", 解决客户ID只能定制获取方案(此方案语音助手将等待此ID再被动拉起), 此方案需要客户端同步开放定制, 使用时请联系开发人员.

// 用例参考
AiLitContext.initialize(application, new SpeechConfig.Builder().setDeviceId("授权设备唯一ID").build(), onSpeechReadyListener)

Tips. Speech模块的Api维度值示例

示例Api 同步Api/异步Api 依据
setVoiceWakeUpEnable() 异步 不关注返回值
getTtsResource() 同步 依赖返回值
setTtsResource() 异步 不关注返回值
startInteraction() 同步 不关注返回值,但是不应延时触发或重试
stopInteraction() 同步 不关注返回值,但是不应延时触发或重试
speak() 同步 不关注返回值,但是不应延时触发或重试

results matching ""

    No results matching ""